﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>
//判断一个数是不是'1'~'9'的字符，不是数学中的数字
//int main()
//{
//	int r = isdigit('c');
// 这里比较的是'1'~'9'的字符
//	int m = isdigit('1');
//	printf("%d\n%d", r,m);
//	return 0;
//}
//找出并打印一个字符数组中的数字
//int main()
//{
//	char arr[] = "abcdef*72@234";
//	int i = 0;
//	while (arr[i] != '\0')
//	{
//		if (isdigit(arr[i]) != 0)
//		{
//			printf("%c ", arr[i]);
//		}
//		i++;
//	}
//	return 0;
//}
//int main()
//{
//	int m = islower('x');
//	int n = islower('M');
//	printf("%d\n%d", m, n);
//	return 0;
//}
// //写一个代码，将字符串中的小写字母转大写，其他字符不变。
//int main()
//{
//	char arr[] = "abcdefSEEF394";
//	int i = 0;
//	while (arr[i] != '\0')
//	{
//		if (islower(arr[i]) != 0)
//		{
//			//小写字母的ASCLL码值=大写字母的ASCLL码值+32；
//			arr[i] -= 32;
//		}
//		printf("%c ", arr[i]);
//		i++;
//	}
//	return 0;
//}
//tolower toupper
//int main()
//{
//	//大写字母转化为小写字母
//	int m = tolower('Q');
//	//小写字母转化为大写字母
//	int n = toupper('q');
//	printf("%c\n%c", m, n);
//	return 0;
//}
//int main()
//{
//	char ch[] = "abcDFDF&(@##123";
//	int i = 0;
//	while (ch[i] != '\0')
//	{
//		if (islower(ch[i]) != 0)
//		{
//			ch[i]=toupper(ch[i]);//转化为大写
//		}
//		printf("%c ", ch[i]);
//		i++;
//	}
//	return 0;
//}
//strlen的使⽤和模拟实现
#include<string.h>
//int main()
//{
//	char str[] = "abcdef";
//	//返回值为size_t，是⽆符号的
//	size_t len = strlen(str);
//	printf("%zd\n", len);
//	return 0;
//}
//模拟实现strlen
#include<assert.h>
////直接计数
//size_t my_strlen(const char* p)
//{
//	//断言这里的p函数不可以为NULL空指针
//	assert(p != NULL);
//	int count = 0;
//	while (*p != '\0')
//	{
//		count++;
//		p++;
//	}
//	//统计'\0'之前出现的字符数
//	return count;
//}
//}
//递归
//my_strlen("abcdef");
//1 + my_strlen("bcdef")
//1 + 1 + my_strlen("cdef")
//1 + 1 + 1 + my_strlen("def")
// ……
//1 + 1 + 1 + 1 + 1 + 1+mystrlen('\0')
//size_t my_strlen(const char* p)
//{
//	assert(p != NULL);
//	if (*p == '\0')
//	{
//		return 0;
//	}
//	else 
//	return 1 + my_strlen(p+1);
// //指针-指针
//size_t my_strlen(const char* p)
//{
//	assert(p != NULL);
//	const char* start = p;
//	while (*p != '\0')
//	{
//		p++;
//	}
//	return p - start;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}
//strcpy的模拟实现
#include<string.h>
#include<assert.h>
//char* my_strlen(char* dest, const char* source)
//{
//	assert(dest && source != NULL);
//	char* start = dest;//把首元素地址的位置保存，方便返回
//	while (*source != '\0')
//	{
//		*dest = *source;
//		dest++;
//		source++;
//	}
//	//返回字符串数组的首地址
//	return start;
//}
//int main()
//{
//	//arr1的空间必须要大，防止存储arr2的内容不够
//	char arr1[20] = "hello";
//	char arr2[] = "world";
//	//char*ret = strcpy(arr1, arr2);//让arr2的内容复制到arr1中
//	char* ret = my_strlen(arr1, arr2);
//	printf("%s", ret);
//	return 0;
//}
//strcat的模拟实现
//字符串拼接
//char* my_strcat(char* arr1,const char* arr2)
//{
//	assert(arr1 && arr2 != NULL);
//	//保存arr1的首地址，便于返回
//	char* start = arr1;
//	while (*arr1 != '\0')
//	{
//		arr1++;
//	}
//	//找出arr1的'\0'的位置
//	//再进行拼接
//	while (*arr2 != '\0')
//	{
//		*arr1 = *arr2;
//		arr2++;
//		arr1++;
//	}
//	//最后arr2指向'\0'
//	//把'\0'给arr1，用于字符串停止
//	*arr1=*arr2;
//	return start;
//}
//int main()
//{
//	//arr1的空间必须要大一点
//	//这样防止拼接导致溢出
//	char arr1[20] = "hello";
//	char arr2[] = "world";
//	//char* ret = strcat(arr1, arr2);
//	char* ret = my_strcat(arr1, arr2);
//	printf("%s\n", ret);
//	return 0;
//}
//strcmp的模拟实现
//较两个字符串中对应位置上字符ASCII码值的⼤⼩
//比较到不相等的那个地方字符串的大小
//int my_strcmp(char* arr1, char* arr2)
//{
//	assert(arr1 && arr2 != NULL);
//	//如果遇到不相等或者遇到'\0'就停止循环
//	while ((*arr1 == *arr2) && (*arr1 != '\0') && (*arr2 != '\0'))
//	{
//		arr1++;
//		arr2++;
//	}
//	//找到了不相等，或者截止位置，直接相减
//	//如果是正arr1>arr2
//	//负arr1<arr2
//	//0arr1==arr2
//	return *arr1 - *arr2;
//}
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "abcd";
//	int ret = strcmp(arr1, arr2);
//	//int ret = my_strcmp(arr1, arr2);
//	if (ret > 0)
//	{
//		printf("arr1>arr2");
//	}
//	else if (ret < 0)
//	{
//		printf("arr1<arr2");
//	}
//	else
//	{
//		printf("arr1==arr2");
//	}
//	return 0;
//}
//strncpy函数的使⽤
//int main()
//{
//    char arr1[20] = "ABCDE";
//    char arr2[] = "abcdef";
//    //自己确定传多少个字符
//    char* ret = strncpy(arr1, arr2, 3);
//    printf("%s\n", ret);
//    return 0; 
//}
//strncat函数的使⽤
//int main()
//{
//	//创建大一点的空间，防止不够存储
//	char arr1[20] = "hello";
//	char arr2[] = "qqqqq";
//	char* ret = strncat(arr1, arr2, 3);
//	printf("%s\n", ret);
//	return 0;
//}
//strncmp函数的使⽤
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "abcccc";
//	int ret = strncmp(arr1, arr2,3);
//	if (ret > 0)
//	{
//		printf("arr1>arr2");
//	}
//	else if (ret < 0)
//	{
//		printf("arr1<arr2");
//	}
//	else
//	{
//		printf("arr1==arr2");
//	}
//	return 0;
//}
//strstr模拟与实现
// 字符串查找函数
// 函数返回字符串arr2在字符串arr1中第⼀次出现的位置
// 从返回的地址开始打印arr1
//const char* my_strstr(const char* arr1,const char* arr2)
//{
//	//初始化为空指针
//	const char* s1= NULL;
//	const char* s2 = NULL;
//	//存放我们要查找的的位置
//	const char* p = arr1;
//	while (*p != '\0')
//	{
//		//保存arr1的地址
//		//每次会改变
//		s1 = p;
//		//每回查找可以是arr2的最开始位置
//		//保存arr2首地址
//		s2 = arr2;
//		//找到arr1与arr2中首元素相同的位置开始每个元素的查找
//		while ((*s1 == *s2) && (*s1 != '\0') && (*s2 != '\0'))
//		{
//			s1++;
//			s2++;
//		}
//		//如果s2走到了末尾，说明前面的字符在arr1中
//		if (*s2 == '\0')
//		{
//			//返回在arr1在arr2中第一次出现的位置
//			return p;
//		}
//		//反之，从arr1的下一个元素开始查找
//		p++;
//	}
//	//找不到返回空指针
//	return NULL;
//}
//int main()
//{
//	char arr1[] = "abbbcdef";
//	char arr2[] = "abbb";
//	//char* p = strstr(arr1, arr2);
//	const char* p = my_strstr(arr1, arr2);
//	if (p != NULL)
//	{
//		printf("%s\n", p);
//	}
//	else
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}